package com.sky.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.dto.OrdersCancelDTO;
import com.sky.dto.OrdersConfirmDTO;
import com.sky.dto.OrdersPageQueryDTO;
import com.sky.dto.OrdersRejectionDTO;
import com.sky.entity.OrderDetail;
import com.sky.entity.Orders;
import com.sky.mapper.OrderDetailMapper;
import com.sky.mapper.OrderMapper;
import com.sky.result.PageResult;
import com.sky.service.OrderService;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private OrderDetailMapper orderDetailMapper;

    /**
     * 条件搜索订单
     * @param dto
     * @return
     */
    @Override
    public PageResult conditionSearch(OrdersPageQueryDTO dto) {
        // 步骤1: 启动分页
        PageHelper.startPage(dto.getPage(), dto.getPageSize());

        // 步骤2: 执行数据库查询
        Page<Orders> page = orderMapper.conditionSearch(dto);

        // 步骤3: 数据处理与转换
        List<OrderVO> orderVOList = getOrderVOList(page);

        // 步骤4: 封装并返回分页结果 (注意：这里的代码可能有一个小错误)
        PageResult pageResult = new PageResult(page.getTotal(), orderVOList); // 已修正
        return pageResult;
    }
    private List<OrderVO> getOrderVOList(Page<Orders> page) {
        // 步骤1: 创建一个新的List用于存放转换后的结果
        List<OrderVO> orderVOList = new ArrayList<>();

        // 步骤2: 从Page对象中获取原始的订单数据列表
        List<Orders> ordersList = page.getResult();

        // 步骤3: 遍历原始列表并进行转换
        if (!CollectionUtils.isEmpty(ordersList)) {
            for (Orders orders : ordersList) {
                // 3.1: 复制基础属性
                OrderVO orderVO = new OrderVO();
                BeanUtils.copyProperties(orders, orderVO);
                // 将 Long 类型的 userId 转换为 String，并设置给 userName 属性
                orderVO.setUserName(String.valueOf(orders.getUserId()));
                // 3.2: 处理特殊属性（订单菜品字符串）
                String orderDishes = getOrderDishesStr(orders);
                orderVO.setOrderDishes(orderDishes);

                // 3.3: 将处理好的VO对象添加到结果List中
                orderVOList.add(orderVO);
            }
        }
        // 步骤4: 返回处理完成的List
        return orderVOList;
    }
    /**
     * 根据订单id获取菜品信息字符串
     *
     * @param orders
     * @return
     */
    private String getOrderDishesStr(Orders orders) {
        // 查询订单菜品详情信息（订单中的菜品和数量）
        List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(orders.getId());
        // 将每一条订单菜品信息拼接为字符串（格式：宫保鸡丁*3；）
        List<String> orderDishList = orderDetailList.stream().map(x -> {
            String orderDish = x.getName() + "*" + x.getNumber() + ";";
            return orderDish;
        }).collect(Collectors.toList());
        // 将该订单对应的所有菜品信息拼接在一起
        return String.join("", orderDishList);
    }


    /**
     * 各个状态的订单数量统计
     * @return
     */
    @Override
    public OrderStatisticsVO statistics() {
        return orderMapper.statistics();
    }

    /**
     * 取消订单
     * @param ordersCancelDTO
     */
    @Override
    public void cancel(OrdersCancelDTO ordersCancelDTO) {
       //根据id更改订单状态
        ordersCancelDTO.setCancelTime(LocalDateTime.now());//设置取消时间
        orderMapper.updateStatusById(ordersCancelDTO, Orders.CANCELLED);
    }

    /**
     * 完成订单
     * @param id
     */
    @Override
    public void complete(Long id) {
        orderMapper.updateCompleteById(id, Orders.COMPLETED);
    }

    /**
     * 拒单
     * @param ordersRejectionDTO
     */
    @Override
    public void rejection(OrdersRejectionDTO ordersRejectionDTO) {
        //获取前端传来的拒单原因
        String rejectionReason = ordersRejectionDTO.getRejectionReason();
        //设置取消原因
        ordersRejectionDTO.setCancelReason(rejectionReason);
        ordersRejectionDTO.setCancelTime(LocalDateTime.now());//设置取消时间
        orderMapper.updaterejectionById(ordersRejectionDTO, Orders.CANCELLED);
    }

    /**
     * 接单
     * @param ordersConfirmDTO
     */
    @Override
    public void confirm(OrdersConfirmDTO ordersConfirmDTO) {
        Long id = ordersConfirmDTO.getId();
        orderMapper.updateConfirm(id, Orders.CONFIRMED);
    }

    /**
     * 派送订单
     * @param id
     */
    @Override
    public void delivery(Long id) {
        orderMapper.updatedelivery(id, Orders.DELIVERY_IN_PROGRESS);
    }

    /**
     * 查询订单详情
     * @param id 订单的ID
     * @return OrderVO 封装了完整订单信息的视图对象
     */
    @Override
    public OrderVO details(Long id) {
        // 步骤 1: 根据ID查询订单的基本信息
        Orders orders = orderMapper.getById(id);
        // 步骤 2: 创建用于返回给前端的VO对象
        OrderVO orderVO = new OrderVO();
        // 步骤 3: 复制基础属性
        BeanUtils.copyProperties(orders, orderVO);
        // 步骤 4: 根据订单ID查询关联的菜品详情列表
        List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(id);
        // 步骤 5: 将菜品详情列表设置到VO对象中
        orderVO.setOrderDetailList(orderDetailList);
        // 步骤 6: 返回组装完成的VO对象
        return orderVO;
    }
}
